import {resolve} from 'path'
import {loadEnv} from 'vite'
import type {UserConfig, ConfigEnv} from 'vite'
import Vue from '@vitejs/plugin-vue'
import WindiCSS from 'vite-plugin-windicss'
import VueJsx from '@vitejs/plugin-vue-jsx'
import VueI18n from '@intlify/vite-plugin-vue-i18n'
import styleImport, {ElementPlusResolve} from 'vite-plugin-style-import'
import {createSvgIconsPlugin} from 'vite-plugin-svg-icons'
import PurgeIcons from 'vite-plugin-purge-icons'
import {viteMockServe} from 'vite-plugin-mock'
import DefineOptions from 'unplugin-vue-define-options/vite'
import {createHtmlPlugin} from 'vite-plugin-html'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import {ElementPlusResolver} from 'unplugin-vue-components/resolvers'
import viteCompression from 'vite-plugin-compression';

// https://vitejs.dev/config/
const root = process.cwd()

function pathResolve(dir: string) {
    return resolve(root, '.', dir)
}

// https://vitejs.dev/config/
export default ({command, mode}: ConfigEnv): UserConfig => {
    let env: any = null
    const isBuild = command === 'build'
    if (!isBuild) {
        env = loadEnv((process.argv[3] === '--mode' ? process.argv[4] : process.argv[3]), root)
    } else {
        env = loadEnv(mode, root)
    }
    return {
        base: env.VITE_BASE_PATH,
        plugins: [
            Vue(),
            VueJsx(),
            WindiCSS(),
            styleImport({
                resolves: [ElementPlusResolve()],
                libs: [{
                    libraryName: 'element-plus',
                    esModule: true,
                    resolveStyle: (name) => {
                        return `element-plus/es/components/${name.substring(3)}/style/css`
                    }
                }]
            }),
            VueI18n({
                runtimeOnly: true,
                compositionOnly: true,
                include: [resolve(__dirname, 'src/locales/**')]
            }),
            createSvgIconsPlugin({
                iconDirs: [pathResolve('src/assets/svgs')],
                symbolId: 'icon-[dir]-[name]',
                svgoOptions: true
            }),
            PurgeIcons(),
            viteMockServe({
                ignore: /^\_/,
                mockPath: 'mock',
                localEnabled: !isBuild,
                prodEnabled: isBuild,
                injectCode: `
          import { setupProdMockServer } from '../mock/_createProductionServer'

          setupProdMockServer()
          `
            }),
            DefineOptions(),
            createHtmlPlugin({
                inject: {
                    data: {
                        title: env.VITE_APP_TITLE,
                        injectScript: `<script src="./inject.js"></script>`,
                    }
                }
            }),
            AutoImport({
                resolvers: [ElementPlusResolver()],
            }),
            Components({
                resolvers: [ElementPlusResolver()],
            }),

            viteCompression({
                filter: /\.(js|css|json|txt|ico|svg)(\?.*)?$/i, // 需要压缩的文件
                threshold: 1024, // 文件容量大于这个值进行压缩
                algorithm: 'gzip', // 压缩方式
                ext: 'gz', // 后缀名
                deleteOriginFile: true, // 压缩后是否删除压缩源文件
            }),

        ],

        css: {
            preprocessorOptions: {
                less: {
                    additionalData: '@import "./src/styles/variables.module.less";',
                    javascriptEnabled: true
                }
            }
        },
        resolve: {
            extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.less', '.css'],
            alias: [
                {
                    find: 'vue-i18n',
                    replacement: 'vue-i18n/dist/vue-i18n.cjs.js'
                },
                {
                    find: /\@\//,
                    replacement: `${pathResolve('src')}/`
                }
            ]
        },
        build: {
            minify: 'terser',
            outDir: env.VITE_OUT_DIR || 'dist',
            sourcemap: env.VITE_SOURCEMAP === 'true' ? 'inline' : false,
            brotliSize: false,
            terserOptions: {
                compress: {
                    drop_debugger: env.VITE_DROP_DEBUGGER === 'true',
                    drop_console: env.VITE_DROP_CONSOLE === 'true'
                }
            }
        },
        server: {
            host: "0.0.0.0",
            port: 5000, // 设置服务启动端口号
            open: true, // 设置服务启动时是否自动打开浏览器
            cors: true,// 允许跨域
            proxy: {
                // 开发
                '/api': {
                    target: 'http://127.0.0.1:8080',// 后台接口
                    changeOrigin: true,
                    secure: false, // 如果是https接口，需要配置这个参数
                    ws: true, //websocket支持
                    rewrite: path => path.replace(/^\/api/, '')
                },
                //测试环境
                '/pro': {
                    target: 'https://mp.changjkj.com',// 后台接口
                    changeOrigin: true,
                    secure: false, // 如果是https接口，需要配置这个参数
                    ws: true, //websocket支持
                    rewrite: path => path.replace(/^\/pro/, '')
                }
            },
            hmr: {
                overlay: false
            },
        },
        optimizeDeps: {
            include: [
                'vue',
                'vue-router',
                'vue-types',
                'element-plus/es/locale/lang/zh-cn',
                'element-plus/es/locale/lang/en',
                '@iconify/iconify',
                '@vueuse/core',
                'axios',
                'qs'
            ]
        }
    }
}

